package ar.edu.unrn.lia.bean;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.map.OverlaySelectEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

import ar.edu.unrn.lia.model.Cuenta;
import ar.edu.unrn.lia.model.Propiedad;
import ar.edu.unrn.lia.model.Propiedad.Estado;
import ar.edu.unrn.lia.service.ContableService;
import ar.edu.unrn.lia.service.CuentaService;
import ar.edu.unrn.lia.service.PropiedadService;
import ar.edu.unrn.lia.service.exception.BusinessException;

@ManagedBean(name = "homeBean")
@ViewScoped
public class HomeBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{propiedadService}")
	PropiedadService propiedadService;

	@ManagedProperty(value = "#{cuentaService}")
	CuentaService cuentaService;
	
	@ManagedProperty(value = "#{contableService}")
	ContableService contableService;

	private Cuenta cuenta;
	
	private List<Cuenta> deudores;
	
	private List<Cuenta> acredores;

	private Double totalDeuda;
	
	private Double totalAdredor;
	
	

	public List<Cuenta> getAcredores() {
		return acredores;
	}

	public void setAcredores(List<Cuenta> acredores) {
		this.acredores = acredores;
	}

	public Double getTotalAdredor() {
		return totalAdredor;
	}

	public void setTotalAdredor(Double totalAdredor) {
		this.totalAdredor = totalAdredor;
	}

	public Double getTotalDeuda() {
		return totalDeuda;
	}

	public void setTotalDeuda(Double totalDeuda) {
		this.totalDeuda = totalDeuda;
	}

	public List<Cuenta> getDeudores() {
		return deudores;
	}

	public void setDeudores(List<Cuenta> deudores) {
		this.deudores = deudores;
	}

	public Cuenta getCuenta() {
		return cuenta;
	}

	public void setCuenta(Cuenta cuenta) {
		this.cuenta = cuenta;
	}

	public CuentaService getCuentaService() {
		return cuentaService;
	}

	public void setCuentaService(CuentaService cuentaService) {
		this.cuentaService = cuentaService;
	}

	private MapModel advancedModel;

	private Marker marker;

	private LatLng centro = new LatLng(UtilsBean.LATLONG.getLat(),
			UtilsBean.LATLONG.getLng());
	
	

	public ContableService getContableService() {
		return contableService;
	}

	public void setContableService(ContableService contableService) {
		this.contableService = contableService;
	}
	
	public void verificarTasaInteres()
	{
		try {
			
			getContableService().tasaInteresFechaHoy();
		} catch (BusinessException e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Tasa Interes",e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
	}

	@PostConstruct
	public void inicio() {
		try {
			setCuenta(getCuentaService().obtenerCuentaCaja());
			
			setDeudores(getCuentaService().buscarCuentaConDeuda());
			setAcredores(getCuentaService().buscarCuentaAcredor());
			
			setTotalDeuda(0D);
			for (Cuenta cd : getDeudores()) {
				setTotalDeuda(getTotalDeuda()+ cd.getSaldo()); 
			}
			
			setTotalAdredor(0D);
			for (Cuenta cd : getAcredores()) {
				setTotalAdredor(getTotalAdredor()+ cd.getSaldo()); 
			}
			
			
			
		} catch (BusinessException e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Error",e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
				
		
		advancedModel = new DefaultMapModel();
		
		for (Propiedad p : getPropiedadService().getAll()) {
			String icon = "";
			if (p.getCoordenada() != null) {
				if (p.getEstado().equals(Estado.D)) {
					icon = FacesContext.getCurrentInstance()
							.getExternalContext().getRequestContextPath()
							+ "/resources/images/gmap-icon-disponible.png";				

					advancedModel.addOverlay(new Marker(new LatLng(p
							.getCoordenada().getLat(), p.getCoordenada().getLng()),
							p.direccionCompleta(), p.getId().toString(), icon));
				}
			}

		}
		
	}

	public MapModel getAdvancedModel() {
		return advancedModel;
	}

	public void onMarkerSelect(OverlaySelectEvent event) {
		marker = (Marker) event.getOverlay();
	}

	public Marker getMarker() {
		return marker;
	}

	public PropiedadService getPropiedadService() {
		return propiedadService;
	}

	public void setPropiedadService(PropiedadService propiedadService) {
		this.propiedadService = propiedadService;
	}

	public LatLng getCentro() {
		return centro;
	}

	public void setCentro(LatLng centro) {
		this.centro = centro;
	}
	
}